Merged.
authoremellor@ewan <emellor@ewan>
Wed, 28 Sep 2005 14:03:00 +0000 (15:03 +0100)
committeremellor@ewan <emellor@ewan>
Wed, 28 Sep 2005 14:03:00 +0000 (15:03 +0100)
linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c
linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c

index 088b7e0e36227132afe35859d2ca1a7d46e08637..7ebbe25348d168f0dc4afe68fcc88580d4cc3671 100644 (file)
@@ -209,7 +209,10 @@ static void dump_fault_path(unsigned long address)
 {
        unsigned long *p, page;
 
-        page = __pa(per_cpu(cur_pgd, smp_processor_id()));
+       preempt_disable();
+       page = __pa(per_cpu(cur_pgd, smp_processor_id()));
+       preempt_enable();
+
        p  = (unsigned long *)__va(page);
        p += (address >> 30) * 2;
        printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]);
@@ -237,8 +240,13 @@ static void dump_fault_path(unsigned long address)
 {
        unsigned long page;
 
+       preempt_disable();
        page = ((unsigned long *) per_cpu(cur_pgd, smp_processor_id()))
            [address >> 22];
+       preempt_enable();
+
+       page = ((unsigned long *) per_cpu(cur_pgd, get_cpu()))
+           [address >> 22];
        printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
               machine_to_phys(page));
        /*
@@ -567,7 +575,9 @@ vmalloc_fault:
                pmd_t *pmd, *pmd_k;
                pte_t *pte_k;
 
+               preempt_disable();
                pgd = index + per_cpu(cur_pgd, smp_processor_id());
+               preempt_enable();
                pgd_k = init_mm.pgd + index;
 
                if (!pgd_present(*pgd_k))
index 3a4db31d4de6a74b091d19a828d6df8450f9228a..d7ef1409cdceefd4b0ec00e501e58b3f4a4ae802 100644 (file)
@@ -149,7 +149,9 @@ void dump_pagetable(unsigned long address)
        pmd_t *pmd;
        pte_t *pte;
 
+       preempt_disable();
        pgd = (pgd_t *)per_cpu(cur_pgd, smp_processor_id());
+       preempt_enable();
        pgd += pgd_index(address);
 
        printk("PGD %lx ", pgd_val(*pgd));
@@ -252,7 +254,9 @@ static int vmalloc_fault(unsigned long address)
 
        /* On Xen the line below does not always work. Needs investigating! */
        /*pgd = pgd_offset(current->mm ?: &init_mm, address);*/
+       preempt_disable();
        pgd = (pgd_t *)per_cpu(cur_pgd, smp_processor_id());
+       preempt_enable();
        pgd += pgd_index(address);
 
        pgd_ref = pgd_offset_k(address);